#ifndef _LOGGER_H_
#define _LOGGER_H_

#include <memory>
#include <spdlog/sinks/rotating_file_sink.h>
#include <spdlog/sinks/stdout_color_sinks.h>
#include <spdlog/spdlog.h>

class Logger {
public:
    /* 获取单例实例 */
    static std::shared_ptr<spdlog::logger> getLogger(
        const std::string& log_file = "/home/avs/release/logs/vlog.log",
        size_t max_file_size = 5 * 1024 * 1024,
        size_t max_files = 200)
    {
        if (!logger) {
            /* 创建控制台输出 sink */
            auto console_sink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
            console_sink->set_level(spdlog::level::info);
            console_sink->set_pattern("%^%Y-%m-%d %H:%M:%S %L %-6t %v %$");

            /* 创建滚动日志文件输出 sink */
            auto file_sink = std::make_shared<spdlog::sinks::rotating_file_sink_mt>(log_file, max_file_size, max_files);
            file_sink->set_level(spdlog::level::trace);
            file_sink->set_pattern("%Y-%m-%d %H:%M:%S %L %t %v");

            /* 创建一个多 sink 日志器 */
            logger = std::make_shared<spdlog::logger>("multi_sink_logger", spdlog::sinks_init_list { console_sink, file_sink });
            logger->set_level(spdlog::level::trace);
        }
        return logger;
    }

    /* 设置日志级别 */
    static void setLogLevel(spdlog::level::level_enum level)
    {
        if (logger) {
            logger->set_level(level);
        }
    }

    /* 记录 TRACE 级别日志，支持格式化 */
    template <typename... Args>
    static void trace(const char* fmt, Args&&... args)
    {
        getLogger()->trace(fmt, std::forward<Args>(args)...);
    }

    /* 记录 DEBUG 级别日志，支持格式化 */
    template <typename... Args>
    static void debug(const char* fmt, Args&&... args)
    {
        getLogger()->debug(fmt, std::forward<Args>(args)...);
    }

    /* 记录 INFO 级别日志，支持格式化 */
    template <typename... Args>
    static void info(const char* fmt, Args&&... args)
    {
        getLogger()->info(fmt, std::forward<Args>(args)...);
    }

    /* 记录 WARN 级别日志，支持格式化 */
    template <typename... Args>
    static void warn(const char* fmt, Args&&... args)
    {
        getLogger()->warn(fmt, std::forward<Args>(args)...);
    }

    /* 记录 ERROR 级别日志，支持格式化 */
    template <typename... Args>
    static void error(const char* fmt, Args&&... args)
    {
        getLogger()->error(fmt, std::forward<Args>(args)...);
    }

    /* 记录 CRITICAL 级别日志，支持格式化 */
    template <typename... Args>
    static void critical(const char* fmt, Args&&... args)
    {
        getLogger()->critical(fmt, std::forward<Args>(args)...);
    }

private:
    /* 私有构造函数，禁止外部创建实例 */
    Logger() = default;

    /* 私有析构函数 */
    ~Logger() = default;

    /* 单例日志实例 */
    static std::shared_ptr<spdlog::logger> logger;
};

#endif
